<html>
				<head>
				<meta http-equiv="content-type" content="text/html; charset=UTF-8">
				</head>
				<body><pre>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.freebsd.org/cgi/man.cgi?query=ACCEPT&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">ACCEPT(2)</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeBSD System Calls Manual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.freebsd.org/cgi/man.cgi?query=ACCEPT&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">ACCEPT(2)</a></pre>
<pre>
<b>名称</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;accept -- 接受一个套接字的连接</pre>
<pre>
<b>库</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Standard C Library (libc, -lc)</pre>
<pre>
<b>概要</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include &lt;<font color="dark">sys/types.h</font>&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include &lt;<font color="dark">sys/socket.h</font>&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="red">int</font> <font color="blue">accept</font>(<font color="red">int</font> <font color="green">s</font>, <font color="red">struct sockaddr * restrict</font> <font color="green">addr</font>, <font color="red">socklen_t * restrict</font> <font color="green">addrlen</font>);</pre>
<pre>
<b>详述</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数<b><font color="green">s</font></b>是一个套接字，它由<a href="http://www.freebsd.org/cgi/man.cgi?query=socket&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">socket(2)</a>创建并用<a href="http://www.freebsd.org/cgi/man.cgi?query=bind&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">bind(2)</a>关联到某地址，
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后在调用<a href="http://www.freebsd.org/cgi/man.cgi?query=listen&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">listen(2)</a>后等待连接。<font color=blue>accept()</font>系统调用提取未连接队列中的
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一个连接请求，创建一个新套接字，并且为该套接字分配一个新文件描述符，
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此文件描述符将继承套接字 <b><font color="green">s</font></b> 的 <u>O_NONBLOCK</u> 属性。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果未连接队列为空，若 <b><font color="green">s</font></b> 没有设置为非阻塞，则<font color=blue>accept()</font>将阻塞调用者
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;直到有连接到来；若 <b><font color="green">s</font></b> 设置为非阻塞，则<font color=blue>accept()</font>返回一个错误代码（描
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;述见下）。已被接受的套接字不能用于接受其它套接字，而 <b><font color="green">s</font></b> 可继续接受。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数<b><font color="green">addr</font></b>将被写入连接实体（即网络层communications layer）的地址。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="green">addr</font></b>的具体格式由连接所在的区域决定。若不需要地址信息，可指定<b><font color="green">addr</font></b>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为NULL－－此时<b><font color="green">addrlen</font></b>参数无效，应该也指定为NULL。若<b><font color="green">addr</font></b>不为NULL，
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;则<b><font color="green">addrlen</font></b>应该以<b><font color="green">addr</font></b>的大小来初始化；在函数返回时，<b><font color="green">addrlen</font></b>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将被设置为返回的<b><font color="green">addr</font></b>的实际字节数。<font color=blue>accept()</font>系统调用被应用于面向连接的
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;套接字，当前为<u>SOCK_STREAM</u>。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>accept()</font>时，可以使用<a href="http://www.freebsd.org/cgi/man.cgi?query=select&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">select(2)</a>来获得<font color=blue>accept()</font>的可读状态。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在某些需要明确确认连接的协议里（如ISO、DATAKIT），可以假定<font color=blue>accept()</font>仅仅使当前连接
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出列，而不确认其连接。当读或写返回的文件描述符时可确定该连接被接受；当返回的
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;套接字被关闭时，可确认该连接被拒绝。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在某些特定的程序里，可以通过<a href="http://www.freebsd.org/cgi/man.cgi?query=accept_filter&sektion=9&apropos=0&manpath=FreeBSD+6.1-RELEASE">accept_filter(9)</a>预处理引进的套接字来提高性能。</pre>
<pre>
<b>返回值</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;失败时返回<b>-1</b>。成功时返回非负整数的文件描述符，指代被接受的套接字。</pre>
<pre>
<b>错误</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>accept()</font>失败时将设置errno为下列错误常量：
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[EBADF]		文件描述符无效
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[EINTR]		<font color=blue>accept()</font>调用被中断
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[EMFILE]	打开文件过多
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ENFILE]	系统文件表已满
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ENOTSOCK]	文件描述符指向的是文件，不是套接字
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[EINVAL]	还没有在套接字上调用<a href="http://www.freebsd.org/cgi/man.cgi?query=listen&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">listen(2)</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=red>[EINVAL]</font>	<b><font color="green">addrlen</font></b>为负。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[EFAULT]	<b><font color="green">addr</font></b>参数指向的内存不可写
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[EWOULDBLOCK]	套接字被设置为非阻塞且此时无可接受的连接
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ECONNABORTED]	一个连接达到，但在队列里等待时被关闭</pre>
<pre>
<b>参见</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.freebsd.org/cgi/man.cgi?query=bind&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">bind(2)</a>, <a href="http://www.freebsd.org/cgi/man.cgi?query=connect&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">connect(2)</a>, <a href="http://www.freebsd.org/cgi/man.cgi?query=getpeername&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">getpeername(2)</a>, <a href="http://www.freebsd.org/cgi/man.cgi?query=listen&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">listen(2)</a>, <a href="http://www.freebsd.org/cgi/man.cgi?query=select&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">select(2)</a>, <a href="http://www.freebsd.org/cgi/man.cgi?query=socket&sektion=2&apropos=0&manpath=FreeBSD+6.1-RELEASE">socket(2)</a>, <a href="http://www.freebsd.org/cgi/man.cgi?query=accept_filter&sektion=9&apropos=0&manpath=FreeBSD+6.1-RELEASE">accept_filter(9)</a></pre>
<pre>
<b>历史</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>accept()</font>系统调用在4.2BSD里首次出现。</pre>
</pre>
</body></html>